#include "TaskQueue.h"

template <typename T>
TaskQueue<T>::TaskQueue()
{
	//初始化互斥锁
	pthread_mutex_init(&m_mx, NULL);
}

template <typename T>
TaskQueue<T>::~TaskQueue()
{
	//释放互斥锁资源
	pthread_mutex_destroy(&m_mx);
}

template <typename T>
void TaskQueue<T>::add_task(Task<T> task)
{
	//在加任务前给任务队列加锁		因为任务队列是共享资源
	pthread_mutex_lock(&m_mx);
	//添加任务
	m_task_q.push(task);
	//解锁
	pthread_mutex_unlock(&m_mx);
}

template <typename T>
void TaskQueue<T>::add_task(callback funtion, void * arg)
{
	//加锁
	pthread_mutex_lock(&m_mx);
	//添加任务
	m_task_q.push(Task<T>(funtion, arg));			//利用匿名构造函数实现
	//解锁
	pthread_mutex_unlock(&m_mx);
}

template <typename T>
Task<T> TaskQueue<T>::take_task()
{
	Task<T> t;
	//加锁
	pthread_mutex_lock(&m_mx);
	//取任务之前需要判断任务队列中是否还有任务
	if (m_task_q.size() > 0)
	{
		t = m_task_q.front();
		m_task_q.pop();
	}
	pthread_mutex_unlock(&m_mx);
	return t;
}
